home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume89
/
util
/
a2ps.1
next >
Wrap
Text File
|
1989-03-16
|
52KB
|
2,094 lines
Path: xanth!lll-winken!ames!mailrus!ulowell!page
From: page@swan.ulowell.edu (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v89i075: a2ps - ascii to postscript converter
Message-ID: <12297@swan.ulowell.edu>
Date: 16 Mar 89 19:28:17 GMT
Organization: University of Lowell, Computer Science Dept.
Lines: 2083
Approved: page@swan.ulowell.edu
Submitted-by: paolucci%snll-arpagw.llnl.gov@lll-lcc.llnl.gov (Sam Paolucci)
Posting-number: Volume 89, Issue 75
Archive-name: util/a2ps.1
Below you will find a utility program that I ported from the Unix
world to the Amiga. It allows to print text files to PostScript
printers. It is very useful for printing listings and AutoDocs as it
prints two logical pages per page, lines can be numbered, it will
print the file names with date and time.
[uuencoded executable included. VERY nice for printing AutoDocs. ..Bob]
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# Makefile
# Makefile.unix
# README
# a2ps.1
# a2ps.1.cat
# a2ps.1.ps
# a2ps.c
# a2ps.ps
# a2ps.uu
# This archive created: Thu Mar 16 14:24:54 1989
cat << \SHAR_EOF > Makefile
CFLAGS = +L -DHEADER_PS="S:a2ps.ps" -DANSIC
OBJS = a2ps.o
a2ps: $(OBJS)
ln -o a2ps $(OBJS) -lc32
SHAR_EOF
cat << \SHAR_EOF > Makefile.unix
#
# Description: Makefile to construct and install a2ps. Don't forget
# to give your own values to define variables HEADER_PS and name of
# compiler (see OPTIONS).
#
# File: imag:/users/local/a2ps/Makefile
# Created: Mon Nov 29 14:05:39 1988 by miguel@imag (Miguel Santana)
# Version: 2.0
#
# Copyright (c) 1988, Miguel Santana, miguel@imag.imag.fr
#
# Permission is granted to copy and distribute this file in modified
# or unmodified form, whether for noncommercial or commercial use,
# provided (a) this copyright notice is preserved, (b) no attempt is
# made to restrict redistribution of this file, and (c) this file is
# not distributed as part of any collection whose redistribution is
# restricted by a compilation copyright.
#
D =.
O =.
I =/users/local/a2ps
OPTIONS =-DHEADER_PS="\"$I/a2ps.ps\"" -DUNIX -O
OBJS = a2ps.o
all: a2ps install
a2ps: a2ps.o
@echo -n "Compiling and linking a2ps ... "
@cc -o $D/xa2ps a2ps.o
@echo "done"
install:; @echo -n "Installing a2ps ... "
@cp xa2ps $I/a2ps
@cp a2ps.ps $I/a2ps.ps
@echo "done"
clean:; @rm -f $(OBJS)
a2ps.o:;
cc -c $(OPTIONS) a2ps.c
SHAR_EOF
cat << \SHAR_EOF > README
This is a new version of a2ps, a program to format an ascii file for
printing in a postcript printer. As the copyright indicates, this
distribution can be freely redistributed.
Initial version was a shell program written by evan@csli (Evan
Kirshenbaum). It was very slow and contained many bugs. The new
version was written in C by Miguel Santana for improve speed
execution and portability. New features and improvements have
been added. I just did a simple port to the Amiga.
Some notes on the distribution:
Installation is done by modifying and executing Makefile included
in this distribution. You must give your own values to two variables:
- HEADER_PS with the included Makefile, a2ps will search S: for
the file a2ps.ps at execution time.
- compiler compiler name, actually one of UNIX, SYSV, ANSIC. Turbo
C and Microsoft C are considered ANSIC compilers. On the
Amiga compile with the ANSIC flag for either Manx C or
Lattice C compilers.
a2ps has been successfully ported to Unix 4.3BSD, Unix SystemV, MSDOS,
and AmigaDOS.
The a2ps distribution consists of the following files:
README This message
Makefile
a2ps.c a2ps source
a2ps.1 a troff manual (man file)
a2ps.ps postcript header used by a2ps
Decide where you want to keep these files and move it there.
Edit "Makefile" and change the definition of HEADER_PS (to
reflect the full pathname of a2ps.ps) and of compiler name.
To make a2ps do:
make a2ps
To install it, do:
make install
Format the manual entry using
nroff -man a2ps.1
Please send problems and feedback to:
miguel@imag.fr or miguel@imag.UUCP (uunet.uu.net!imag!miguel)
Miguel SANTANA
LGI
IMAG-Campus
BP 53X
38041 Grenoble Cedex
For the Amiga version contact:
paolucci@snll-arpagw.llnl.gov
Dr. Samuel Paolucci
1351 Roselli Dr.
Livermore, CA 94550
SHAR_EOF
cat << \SHAR_EOF > a2ps.1
.\" @(#)a2ps.man.1 2.0 11/29/88
.\"
.TH A2PS 1L "November 29 1988"
.UC 4
.SH NAME
a2ps \- formats an ascii file for printing in a postscript printer;
very nice and compact format for program listings.
.SH SYNOPSIS
.B a2ps
[ -b ] [ -f ] [ -i ] [ -n ] [ -n{bfinrv} ] [ -r ] [ -v ] [
.B file1
] [
.B file2
] [...]
.SH DESCRIPTION
.B a2ps
formats files "file1", "file2", ... for printing in a postscript printer;
if no file is given,
.B a2ps
reads from the standard input.
Format used is very nice and compact: two pages on each physical page,
borders surrounding pages, headers with useful information (page number,
printing date, file name), line numbering, etc. Very useful to
archive listings of programs.
.PP
Options offered by
.B a2ps
are the following:
.TP 0.6i
.B -b
Force printing binary files. By default, binary files printing is
stopped before second page (see -nb option).
.TP 0.6i
.B -f
Fold lines too large to be printed inside the borders (default option).
Max size is actually 86 characters.
.TP 0.6i
.B -i
Interpret TAB, BS and FF characters (default option). TAB is replaced by
enough spaces to reach next tab stop while BS and FF have their meanings.
.TP 0.6i
.B -n
Output lines are preceded by line numbers, numbered sequentially from 1
(default option).
.TP 0.6i
.B -nb
Don't print binary files. To detect such a file we make use of a
very simple heuristic: if the first page of the file contains at
less 75% of non-printing characters, it's a binary file. First page
is always printed.
.TP 0.6i
.B -nf
Cut lines too large (don't fold).
.TP 0.6i
.B -ni
Don't interpret TAB, BS and FF characters. They will be printed
according to -v option.
.TP 0.6i
.B -nn
Don't number output lines.
.TP 0.6i
.B -nr
Sheet numbering (see -r option) must be continue for all files (don't
reset on new file).
.TP 0.6i
.B -nv
Replace non-printing characters by a space.
.TP 0.6i
.B -r
Reset sheet numbering for each new file (default option). Sheet numbering
is used to number physical pages (sheets printed) and is placed
in the bottom of each physical page. It differs from page numbering: logical
pages of file been printed.
.TP 0.6i
.B -v
Replace non-printing characters so that they are lisible and easy to identify
(default option). Control characters (ascii codes lower than 0x20) are
printed like ^X for ctrl-x; the delete character (hex 0x3f) is printed
as ^?. Non ascii characters (with the high bit set) are printed as M-
(for meta) followed by the character of the low 7 bits. TAB, BS and FF are
handled like non-printing characters if -ni option was taked.
.SH USAGE
.PP
.B a2ps
sends formatted file to standard output. User could redirect this output
to a file or pipe it directly to a print command, like lpr in UNIX:
.ti +0.5i
a2ps file1 > file2
.ti +0.5i
a2ps file1 | lpr -l
.PP
Don't forget
.B -l
option in last line, if you want that
.B lpr
interprets your postscript program.
.PP
This filter must be used only with text files. Avoid specially output from
TeX, troff or any other text formatter.
.SH "SEE ALSO"
pprps(1L) tgrind(1) lpr(1)
.SH AUTHORS
Evan Kirshenbaum (evan@csli) for the initial version.
.br
Miguel Santana (miguel@imag.imag.fr) for 2.0 version.
SHAR_EOF
cat << \SHAR_EOF > a2ps.1.cat
A2PS(1L)
NAME
a2ps - formats an ascii file for printing in a postscript
printer; very nice and compact format for program listings.
SYNOPSIS
a2ps [ -b ] [ -f ] [ -i ] [ -n ] [ -n{bfinrv} ] [ -r ] [ -v
] [ file1 ] [ file2 ] [...]
DESCRIPTION
a2ps formats files "file1", "file2", ... for printing in a
postscript printer; if no file is given, a2ps reads from the
standard input. Format used is very nice and compact: two
pages on each physical page, borders surrounding pages,
headers with useful information (page number, printing date,
file name), line numbering, etc. Very useful to archive
listings of programs.
Options offered by a2ps are the following:
-b Force printing binary files. By default, binary files
printing is stopped before second page (see -nb
option).
-f Fold lines too large to be printed inside the borders
(default option). Max size is actually 86 characters.
-i Interpret TAB, BS and FF characters (default option).
TAB is replaced by enough spaces to reach next tab
stop while BS and FF have their meanings.
-n Output lines are preceded by line numbers, numbered
sequentially from 1 (default option).
-nb Don't print binary files. To detect such a file we
make use of a very simple heuristic: if the first page
of the file contains at less 75% of non-printing char-
acters, it's a binary file. First page is always
printed.
-nf Cut lines too large (don't fold).
-ni Don't interpret TAB, BS and FF characters. They will
be printed according to -v option.
-nn Don't number output lines.
-nr Sheet numbering (see -r option) must be continue for
all files (don't reset on new file).
-nv Replace non-printing characters by a space.
-r Reset sheet numbering for each new file (default
1
A2PS(1L)
option). Sheet numbering is used to number physical
pages (sheets printed) and is placed in the bottom of
each physical page. It differs from page numbering:
logical pages of file been printed.
-v Replace non-printing characters so that they are lisi-
ble and easy to identify (default option). Control
characters (ascii codes lower than 0x20) are printed
like ^X for ctrl-x; the delete character (hex 0x3f) is
printed as ^?. Non ascii characters (with the high bit
set) are printed as M- (for meta) followed by the
character of the low 7 bits. TAB, BS and FF are han-
dled like non-printing characters if -ni option was
taked.
USAGE
a2ps sends formatted file to standard output. User could
redirect this output to a file or pipe it directly to a
print command, like lpr in UNIX:
a2ps file1 > file2
a2ps file1 | lpr -l
Don't forget -l option in last line, if you want that lpr
interprets your postscript program.
This filter must be used only with text files. Avoid spe-
cially output from TeX, troff or any other text formatter.
SEE ALSO
pprps(1L) tgrind(1) lpr(1)
AUTHORS
Evan Kirshenbaum (evan@csli) for the initial version.
Miguel Santana (miguel@imag.imag.fr) for 2.0 version.
2
SHAR_EOF
cat << \SHAR_EOF > a2ps.1.ps
%!PS-Adobe-1.0
%%Creator: waterworks:paolucci (Sam Paolucci)
%%Title: stdin
%%CreationDate: Thu Jan 19 07:42:19 1989
%%DocumentFonts: Times-Roman Times-Italic Times-Bold Symbol Times-Roman
%%Pages: (atend)
%%EndComments
% lib/pscat.pro -- prolog for pscat (troff) files
% Copyright (C) 1985 Adobe Systems, Inc.
% Added defs for Manual Feed
save /pscatsave exch def
/$pscat 50 dict def
$pscat begin
/fm [1 0 0 1 0 0] def
/xo 0 def /yo 0 def
/M /moveto load def
/R /show load def
/S {exch currentpoint exch pop moveto show}def
/T {exch currentpoint pop exch moveto show}def
/U {3 1 roll moveto show}def
/siz 0 def
/font 0 def
/Z {/siz exch def SF}def
/F {/font exch def SF}def
/SF{font 0 ne
{catfonts font 1 sub get fm 0 siz put fm 3 siz neg put
fm makefont setfont}if}def
/BP{save/catsv exch def 0 792 translate 72 432 div dup neg scale
xo yo translate 0 0 moveto}def
/BPL{save/catsv exch def 72 8.25 mul 792 translate -90 rotate
72 432 div dup neg scale xo yo translate 0 0 moveto}def
/EP{catsv restore showpage}def
/SetStTime{statusdict /manualfeedtimeout 120 put} def
/SetStatus{statusdict /manualfeed true put
statusdict /product get (LaserWriter) eq
{version (23.0) eq % Don't redefine EP if printer is not "Classic LW"
{/EP {catsv restore
{statusdict /printerstatus get exec 16#22000000 and 0 eq{exit}if}loop
showpage}def}if }if}def
% definitions for PPROC callback functions
% each PPROC is called with the following number on the stack:
% pointsize charcode railmag pswidth pschar x y wid
/$pprocs 50 dict def
/fractm [.65 0 0 .6 0 0] def
% fractions
/PS1{gsave $pprocs begin
/wid exch def pop pop pop pop pop /ch exch def /size exch def
/pair $pprocs ch get def /cf currentfont def
cf fractm makefont setfont
0 .3 size mul 6 mul 2 copy neg rmoveto pair 0 get show rmoveto
currentfont cf setfont (\244) show setfont
pair 1 get show grestore wid .06 div 0 rmoveto end}def
$pprocs begin
8#34 [(1)(4)] def
8#36 [(1)(2)] def
8#46 [(3)(4)] def
end
% boxes
/PS2{gsave /wid exch def pop pop /char exch def pop pop pop /size exch def
/len size 3.5 mul def % length of a side
len 0 rlineto 0 len neg rlineto len neg 0 rlineto closepath
char 3 eq {fill}{size 5 mul .07 mul setlinewidth stroke}ifelse
grestore wid .06 div 0 rmoveto}def
/PS3/PS2 load def % boxes are the same...
% circle
/PS4{gsave /wid exch def pop pop pop pop pop pop /size exch def
wid .8333 mul size 2.5 mul neg rmoveto currentpoint % center
newpath size 1.8 mul 0 360 arc size .2 mul setlinewidth stroke
grestore wid .06 div 0 rmoveto}def
/bb{$pprocs begin /wid exch def pop pop pop pop pop pop /size exch 6 mul def
/s2 size 2 div def /s4 size 4 div def gsave
currentpoint newpath transform round exch round exch itransform translate
size 16 div setlinewidth 2 setlinejoin 0 setgray}def
$pprocs begin
/mrr{moveto rlineto rlineto}def
/be{stroke grestore wid .06 div 0 rmoveto end}def
end
% leftfloor
/PS6 {bb s4 0 0 size s4 size -.8 mul mrr be}def
% rightfloor
/PS7 {bb s4 neg 0 0 size s4 size -.8 mul mrr be}def
% leftceil
/PS8 {bb s4 0 0 size neg s4 size .2 mul mrr be}def
% rightceil
/PS9 {bb s4 neg 0 0 size neg s4 size .2 mul mrr be}def
% boldvert
/PS5 {bb 0 0 0 size neg s4 size .2 mul mrr be}def
% box rule
/PS32 {bb /sw size 24 div def sw 2 div size 4.5 div moveto
0 size neg rlineto sw setlinewidth be}def
% rule (roman, bold and italic)
/PS16 {gsave $pprocs begin
/wid exch def pop pop pop pop pop pop /size exch 6 mul def
/sw size 14 div def currentpoint exch sw 2 div sub exch
newpath transform round exch round exch itransform translate
0 0 moveto size 2 div 0 rlineto sw setlinewidth be}def
% lefttopcurl
/PS20 {bb s4 size .2 mul moveto 0 size -.55 mul rlineto currentpoint
pop size -.8 mul 2 copy exch s4 add exch s4 arcto pop pop pop pop be}def
% leftbotcurl
/PS21 {bb s4 size -.8 mul moveto 0 size .55 mul rlineto currentpoint
pop size .2 mul 2 copy exch s4 add exch s4 arcto pop pop pop pop be}def
% righttopcurl
/PS22 {bb s4 size .2 mul moveto 0 size -.55 mul rlineto currentpoint
pop size -.8 mul 2 copy exch s4 sub exch s4 arcto pop pop pop pop be}def
% rightbotcurl
/PS23 {bb s4 size -.8 mul moveto 0 size .55 mul rlineto currentpoint
pop size .2 mul 2 copy exch s4 sub exch s4 arcto pop pop pop pop be}def
% rightmidcurl
/PS25 {bb /s3 size -.3 mul def s4 size -.8 mul moveto s4 s3 s2 s3
s4 arcto pop pop size add s4 s3 4 2 roll
s4 arcto pop pop pop pop s4 size .2 mul lineto be}def
% leftmidcurl
/PS24 {bb /s3 size -.3 mul def s4 size -.8 mul moveto s4 s3 0 s3
s4 arcto pop pop size add s4 s3 4 2 roll s4 arcto pop pop pop pop
s4 size .2 mul lineto be}def
/xo 216 def /yo 0 def
/catfonts [
/Times-Roman findfont
/Times-Italic findfont
/Times-Bold findfont
/Symbol findfont
/Times-Roman findfont
] def
%%EndProlog
%%Page: ? 1
BP
1 F
60 Z
270 381(A2PS)U
419(\()S
449(1L)S
526(\))S
1166(MISC.)S
1347(REFERENCE)S
1711(MANUAL)S
1993(PAGES)S
2802(A2PS)S
2951(\()S
2981(1L)S
3058(\))S
3 F
54 Z
270 669(NAME)U
1 F
60 Z
486 741(a2ps)U
621(\261)S
676(formats)S
885(an)S
967(ascii)S
1103(\256le)S
1205(for)S
1300(printing)S
1516(in)S
1588(a)S
1640(postscript)S
1899(printer;)S
2102(very)S
2234(nice)S
2359(and)S
2470(compact)S
2699(format)S
2884(for)S
2978(pro-)S
486 813(gram)U
630(listings.)S
3 F
54 Z
504 912(S)U
270(SYNOPSI)S
60 Z
486 984(a2ps)U
1 F
622([)S
662(-b)S
732(])S
772([)S
812(-f)S
872(])S
912([)S
952(-i)S
1009(])S
1049([)S
1089(-n)S
1159(])S
1199([)S
1239(-n)S
5 F
({)R
1 F
(b\256nrv)R
5 F
(})R
1 F
1508(])S
1548([)S
1588(-r)S
1648(])S
1688([)S
1728(-v)S
1798(])S
1838([)S
3 F
1878(\256le1)S
1 F
2005(])S
2045([)S
3 F
2085(\256le2)S
1 F
2212(])S
2252([...])S
3 F
54 Z
270 1083(DESCRIPTION)U
60 Z
486 1155(a2ps)U
1 F
627(formats)S
836(\256les)S
5 F
961(")S
1 F
(\256le1)R
5 F
(")R
1 F
(,)R
5 F
1158(")S
1 F
(\256le2)R
5 F
(")R
1 F
(,)R
1355(...)S
1425(for)S
1520(printing)S
1736(in)S
1808(a)S
1860(postscript)S
2119(printer;)S
2322(if)S
2384(no)S
2469(\256le)S
2571(is)S
2636(given,)S
3 F
2810(a2ps)S
1 F
2951(reads)S
3063 1227(,)U
486 1299(b)U
486 1227(from)U
633(the)S
737(standard)S
971(input.)S
1160(Format)S
1364(used)S
1503(is)S
1572(very)S
1708(nice)S
1838(and)S
1954(compact:)S
2205(two)S
2324(pages)S
2490(on)S
2579(each)S
2719(physical)S
2949(page)S
516 1299(orders)U
687(surrounding)S
998(pages,)S
1171(headers)S
1376(with)S
1504(useful)S
1672(information)S
1978(\(page)S
2133(number,)S
2353(printing)S
2565(date,)S
2702(\256le)S
2800(name\),)S
2987(line)S
486 1470(O)U
486 1371(numbering,)U
782(etc.)S
888(Very)S
1028(useful)S
1195(to)S
1262(archive)S
1460(listings)S
1654(of)S
1724(programs.)S
529 1470(ptions)U
696(offered)S
890(by)S
3 F
970(a2ps)S
1 F
1106(are)S
1200(the)S
1294(following:)S
3 F
486 1569(-)U
(b)R
1 F
745(Force)S
911(printing)S
1131(binary)S
1314(\256les.)S
1458(By)S
1557(default,)S
1769(binary)S
1952(\256les)S
2081(printing)S
2301(is)S
2370(stopped)S
2586(before)S
2769(second)S
2964(page)S
3 F
486 1740(-)U
1 F
745 1641(\(see)U
862(-nb)S
962(option\).)S
3 F
506 1740(f)U
1 F
745(Fold)S
877(lines)S
1013(too)S
1112(large)S
1255(to)S
1324(be)S
1403(printed)S
1596(inside)S
1762(the)S
1858(borders)S
2059(\(default)S
2268(option\).)S
2498(Max)S
2629(size)S
2744(is)S
2805(actuall)S
2967(y)S
3018(86)S
3 F
486 1911(-)U
1 F
745 1812(charact)U
920(ers.)S
3 F
506 1911(i)U
1 F
745(Interpret)S
977(TAB,)S
1136(BS)S
1233(and)S
1344(FF)S
1434(charact)S
1609(ers)S
1703(\(default)S
1915(option\).)S
2128(TAB)S
2272(is)S
2336(replace)S
2511(d)S
2565(by)S
2649(enough)S
2850(spaces)S
3031(to)S
3 F
486 2082(-)U
1 F
745 1983(reach)U
896(next)S
1020(tab)S
1114(stop)S
1234(while)S
1388(BS)S
1481(and)S
1588(FF)S
1674(have)S
1808(their)S
1939(meanings.)S
3 F
506 2082(n)U
1 F
745(Output)S
932(lines)S
1066(are)S
1160(preceded)S
1398(by)S
1478(line)S
1589(numbers,)S
1831(numbered)S
2092(sequentiall)S
2354(y)S
2404(from)S
2541(1)S
2591(\(default)S
2799(option\).)S
3051 2181(e)U
3 F
486(-nb)S
1 F
745(Don't)S
909(print)S
1047(binary)S
1225(\256les.)S
1364(To)S
1455(detect)S
1624(such)S
1758(a)S
1809(\256le)S
1909(we)S
2002(make)S
2156(use)S
2259(of)S
2332(a)S
2382(very)S
2512(simple)S
2696(heuristic:)S
2944(if)S
3004(th)S
745 2253(\256rst)U
864(page)S
1004(of)S
1080(the)S
1180(\256le)S
1283(contains)S
1510(at)S
1580(less)S
1696(75%)S
1832(of)S
1907(non-printing)S
2233(charact)S
2408(ers,)S
2518(it's)S
2620(a)S
2672(binary)S
2851(\256le.)S
2968(First)S
3 F
486 2424(-)U
1 F
745 2325(page)U
879(is)S
939(always)S
1126(printed.)S
3 F
506 2424(nf)U
1 F
745(Cut)S
852(lines)S
986(too)S
1083(large)S
1224(\(don't)S
1391(fold\).)S
3 F
486 2523(-)U
(ni)R
1 F
745(Don't)S
905(interpret)S
1130(TAB,)S
1285(BS)S
1378(and)S
1485(FF)S
1571(charact)S
1746(ers.)S
1851(They)S
1995(will)S
2109(be)S
2186(printed)S
2377(according)S
2635(to)S
2702(-v)S
2772(option.)S
3 F
486 2721(-)U
486 2622(-nn)U
1 F
745(Don't)S
905(number)S
1109(output)S
1283(lines.)S
3 F
506 2721(nr)U
1 F
745(Sheet)S
899(numbering)S
1180(\(see)S
1297(-r)S
1357(option\))S
1551(must)S
1688(be)S
1765(continue)S
1993(for)S
2083(all)S
2164(\256les)S
2284(\(don't)S
2451(reset)S
2585(on)S
2665(new)S
2785(\256le\).)S
3 F
486 2919(-)U
486 2820(-nv)U
1 F
745(Replace)S
960(non-printing)S
1281(charact)S
1456(ers)S
1546(by)S
1626(a)S
1673(space.)S
3 F
506 2919(r)U
1 F
745(Reset)S
901(sheet)S
1047(numbering)S
1330(for)S
1422(each)S
1555(new)S
1677(\256le)S
1776(\(default)S
1986(option\).)S
2197(Sheet)S
2352(numbering)S
2634(is)S
2695(used)S
2826(to)S
2894(number)S
745 3063(f)U
745 2991(physical)U
971(pages)S
1133(\(sheets)S
1325(printed\))S
1541(and)S
1653(is)S
1718(placed)S
1901(in)S
1973(the)S
2072(bottom)S
2268(of)S
2343(each)S
2479(physical)S
2705(page.)S
2859(It)S
2921(differs)S
765 3063(rom)U
882(page)S
1016(numbering:)S
1314(logical)S
1499(pages)S
1656(of)S
1726(\256le)S
1823(been)S
1957(printed.)S
3063 3162(.)U
3 F
486(-v)S
1 F
745(Replace)S
965(non-printing)S
1291(charact)S
1466(ers)S
1561(so)S
1639(that)S
1754(they)S
1882(are)S
1980(lisible)S
2152(and)S
2263(easy)S
2394(to)S
2465(identify)S
2677(\(default)S
2889(option\))S
745 3234(Control)U
959(charact)S
1134(ers)S
1234(\(ascii)S
1395(codes)S
1562(lower)S
1729(than)S
1863(0x20\))S
2033(are)S
2137(printed)S
2338(like)S
5 F
2459(\303)S
1 F
(X)R
2552(for)S
2652(ctrl-x;)S
2830(the)S
2933(delete)S
745 3378(a)U
745 3306(charact)U
920(er)S
992(\(hex)S
1124(0x3f\))S
1279(is)S
1344(printed)S
1539(as)S
5 F
1613(\303)S
1 F
(?.)R
1699(Non)S
1826(ascii)S
1961(charact)S
2136(ers)S
2230(\(with)S
2381(the)S
2479(high)S
2610(bit)S
2698(set\))S
2809(are)S
2907(printed)S
772 3378(s)U
820(M-)S
918(\(for)S
1033(meta\))S
1196(followed)S
1435(by)S
1520(the)S
1619(charact)S
1794(er)S
1866(of)S
1940(the)S
2038(low)S
2152(7)S
2206(bits.)S
2332(TAB,)S
2491(BS)S
2588(and)S
2699(FF)S
2789(are)S
2887(handled)S
3 F
54 Z
270 3549(USAGE)U
1 F
60 Z
745 3450(like)U
856(non-printing)S
1177(charact)S
1352(ers)S
1442(if)S
1499(-ni)S
1586(option)S
1760(was)S
1873(taked.)S
3 F
486 3621(a2ps)U
1 F
625(sends)S
781(formatted)S
1039(\256le)S
1139(to)S
1209(standard)S
1436(output.)S
1628(User)S
1764(could)S
1921(redirect)S
2129(this)S
2239(output)S
2416(to)S
2486(a)S
2536(\256le)S
2636(or)S
2709(pipe)S
2836(it)S
2893(directly)S
486 3693(to)U
553(a)S
600(print)S
734(command,)S
1007(like)S
1118(lpr)S
1205(in)S
1272(UNIX:)S
702 3837(a2ps)U
832(\256le1)S
4 F
959(>)S
1 F
1012(\256le2)S
1098 3981(l)U
486 4080(D)U
702 3981(a2ps)U
832(\256le1)S
959(|)S
991(lpr)S
1078(-)S
529 4080(on't)U
646(forget)S
3 F
810(-l)S
1 F
867(option)S
1041(in)S
1108(last)S
1212(line,)S
1338(if)S
1395(you)S
1505(want)S
1642(that)S
3 F
1753(lpr)S
1 F
1850(interprets)S
2098(your)S
2228(postscript)S
2482(program.)S
3061 4179(t)U
486 4251(f)U
486 4179(This)U
618(\256lter)S
757(must)S
899(be)S
981(used)S
1116(only)S
1248(with)S
1380(text)S
1496(\256les.)S
1636(Avoid)S
1811(specially)S
2051(output)S
2230(from)S
2372(TeX,)S
2519(troff)S
2651(or)S
2726(any)S
2838(other)S
2987(tex)S
506 4251(ormatter.)U
270 4701(S)U
(un)R
383(Release)S
591(4.0)S
1271(Last)S
1395(change:)S
1603(November)S
1877(29)S
1957(1988)S
3048(1)S
EP
%%Page: ? 2
BP
1 F
60 Z
3058 381(\))U
3 F
54 Z
270 669(S)U
1 F
60 Z
270 381(A2PS)U
419(\()S
449(1L)S
526(\))S
1166(MISC.)S
1347(REFERENCE)S
1711(MANUAL)S
1993(PAGES)S
2802(A2PS)S
2951(\()S
2981(1L)S
3 F
54 Z
300 669(EE)U
390(ALSO)S
1 F
60 Z
486 741(p)U
(prps\(1L\))R
746(tgrind\(1\))S
980(lpr\(1\))S
3 F
54 Z
270 840(AUTHORS)U
1 F
60 Z
486 912(Evan)U
630(Kirshenbaum)S
974(\(evan)S
5 F
(@)R
1 F
(csli\))R
1287(for)S
1377(the)S
1471(initial)S
1633(version.)S
1848 984(.)U
270 4701(S)U
486 984(Miguel)U
680(Santana)S
891(\(miguel)S
5 F
(@)R
1 F
(ima)R
1225(g.imag.fr\))S
1486(for)S
1576(2.0)S
1671(version)S
303 4701(un)U
383(Release)S
591(4.0)S
1271(Last)S
1395(change:)S
1603(November)S
1877(29)S
1957(1988)S
3048(2)S
EP
%%Trailer
pscatsave end restore
%%Pages: 2
SHAR_EOF
cat << \SHAR_EOF > a2ps.c
/************************************************************************/
/* */
/* Description: Ascii to PostScript printer program. */
/* File: imag:/users/local/a2ps/a2ps.c */
/* Created: Mon Nov 28 15:22:15 1988 by miguel@imag (Miguel Santana) */
/* Version: 2.0 */
/* */
/* Edit history: */
/* 1) Derived of shell program written by evan@csli (Evan Kirshenbaum). */
/* Written in C for improve speed execution and portability. Many */
/* improvements have been added. */
/* 2) Ported to the Amiga Jan 24, 1989 (Samuel Paolucci) */
/* */
/************************************************************************/
/*
* Copyright (c) 1988, Miguel Santana, miguel@imag.imag.fr
*
* Permission is granted to copy and distribute this file in modified
* or unmodified form, for noncommercial use, provided (a) this copyright
* notice is preserved, (b) no attempt is made to restrict redistribution
* of this file, and (c) this file is not distributed as part of any
* collection whose redistribution is restricted by a compilation copyright.
*/
#include <stdio.h>
#ifdef ANSIC
#include <time.h>
#else
#ifdef UNIX
#include <sys/time.h>
#else
#ifdef SYSV
#include <sys/types.h>
#include <sys/timeb.h>
#include <time.h>
#else
error !
#endif
#endif
#endif
#ifndef HEADER_PS
#define HEADER_PS "./header.ps"
#endif
#define LINESPERPAGE 66
#define COLUMNSPERLINE 86
#define FALSE 0
#define TRUE 1
#define PS_EOF 04
int fold_line();
void print_file();
char cut_line();
int column = 0; /* Column number (in current line) */
int line = 0; /* Line number (in current page) */
int line_number = 0; /* Source line number */
int first_page; /* First page for a file */
int nonprinting_chars, chars; /* Number of nonprinting and total chars */
int prefix_width; /* Width in characters for line prefix */
int numbering = TRUE; /* Line numbering option */
int folding = TRUE; /* Line folding option */
int restart = TRUE; /* Restart page number at each file option */
int only_printable = FALSE; /* Replace non printable char by space option */
int interpret = TRUE; /* Interpret TAB, FF and BS chars option */
int print_binaries = FALSE; /* Force printing for binary files */
main(argc, argv)
int argc;
char *argv[];
{
int narg;
char *arg;
/* Option processing */
arg = argv[narg = 1];
while (narg < argc && arg[0] == '-')
{
switch (arg[1])
{
case 'b':
if (arg[2] != NULL)
goto usage;
print_binaries = TRUE;
break;
case 'f':
if (arg[2] != NULL)
goto usage;
folding = TRUE;
break;
case 'i':
if (arg[2] != NULL)
goto usage;
interpret = TRUE;
break;
case 'n':
if (arg[2] == NULL)
{
numbering = TRUE;
break;
}
if (arg[3] != NULL)
goto usage;
switch (arg[2])
{
case 'b':
print_binaries = FALSE;
break;
case 'f':
folding = FALSE;
break;
case 'i':
interpret = FALSE;
break;
case 'n':
numbering = FALSE;
break;
case 'r':
restart = FALSE;
break;
case 'v':
only_printable = TRUE;
break;
default:
goto usage;
}
break;
case 'r':
if (arg[2] != NULL)
goto usage;
restart = TRUE;
break;
case 'v':
if (arg[2] != NULL)
goto usage;
only_printable = FALSE;
break;
default:
usage:
fprintf(stderr,
"usage: a2ps [-n{bfinrv}] [-b] [-f] [-i] [-n] [-r] [-v] [f1 f2 ... fn]\n");
exit(1);
}
arg = argv[++narg];
}
if (narg >= argc)
goto usage;
/* Header printing (postcript prolog) */
print_header();
/* Print files designated or standard input */
prefix_width = numbering ? 6 : 1;
if (narg >= argc)
print_file("stdin");
else
{
while (narg < argc)
{
if (freopen(arg, "r", stdin) == NULL)
{
fprintf(stderr, "Error opening %s\n", arg);
printf("cleanup\n");
exit(1);
}
print_file(arg);
arg = argv[++narg];
}
}
printf("cleanup\n");
putchar(PS_EOF);
}
void print_file(name)
char *name;
{
register int c;
int start_line, continue_exit;
int char_width;
/*
* Printing binary files is not very useful. We stop printing
* if we detect one of these files. Our heuristic to detect them:
* if 50% characters of first page are non-printing characters,
* the file is a binary file.
* Option -b force binary files impression.
*/
first_page = TRUE;
nonprinting_chars = chars = 0;
/*
* Preprocessing (before printing):
* - TABs expansion (see interpret option)
* - FF and BS interpretation
* - replace non printable characters by a space or a char sequence
* like:
* ^X for ascii codes < 0x20 (X = [@, A, B, ...])
* ^? for del char
* M-c for ascii codes > 0x3f
* - prefix parents and backslash ['(', ')', '\'] by backslash
* (escape character in postcript)
*/
column = 0;
line = line_number = 0;
start_line = TRUE;
printf("(%s) newfile\n", name);
if (restart)
printf("/sheet 1 def\n");
printf("startpage\n");
c = getchar();
while (c != EOF)
{
/* Form feed */
if (c == '\f' && interpret)
{
if (!start_line)
printf(") s\n");
start_line = TRUE;
printf("endpage startpage\n");
if (first_page && is_binaryfile(name))
return;
line = 0;
if ((c = getchar()) == EOF)
break;
}
/* Start a new line? */
if (start_line)
{
if (numbering)
printf("(%-5d ", ++line_number);
else
printf("( ");
start_line = FALSE;
}
/* Interpret each character */
switch (c)
{
case '\b':
if (!interpret)
goto print;
if (column)
column--;
putchar(c);
break;
case '\n':
column = 0;
start_line = TRUE;
printf(") s\n");
if (++line >= LINESPERPAGE)
{
printf("endpage startpage\n");
if (first_page && is_binaryfile(name))
return;
line = 0;
}
break;
case '\t':
if (interpret)
{
continue_exit = FALSE;
do
{
if (++column + prefix_width > COLUMNSPERLINE)
if (folding)
{
if (fold_line(name) == FALSE)
return;
}
else
{
c = cut_line();
continue_exit = TRUE;
break;
}
putchar(' ');
} while (column & 0x7);
if (continue_exit)
continue;
break;
}
default:
print:
if (only_printable)
char_width = 1;
else
{
char_width = c > 0177 ? 2 : 0;
char_width += c < ' ' || c == 0177 ? 2 : 1;
}
if (prefix_width + (column += char_width) > COLUMNSPERLINE)
if (folding)
{
if (fold_line(name) == FALSE)
return;
}
else
{
c = cut_line();
continue;
}
if (c == '(' || c == ')' || c == '\\')
putchar('\\');
if (c >= ' ' && c < 0177)
putchar(c);
else
{
nonprinting_chars++;
if (only_printable)
putchar(' ');
else
{
if (c > 0177)
{
printf("M-");
c &= 0177;
}
if (c < ' ')
printf("^%c", c+'@');
else if (c == 0177)
printf("^?");
else
putchar(c);
}
}
chars++;
break;
}
c = getchar();
}
if (!start_line)
printf(") s\n");
printf("endpage\n");
}
int fold_line(name)
char *name;
{
column = 0;
printf(") s\n");
if (++line >= LINESPERPAGE)
{
printf("endpage startpage\n");
if (first_page && is_binaryfile(name))
return FALSE;
line = 0;
}
if (numbering)
printf("( ");
else
printf("( ");
return TRUE;
}
char cut_line()
{
char c;
while ((c = getchar()) != EOF && c != '\n' && c != '\f');
return c;
}
is_binaryfile(name)
char *name;
{
first_page = FALSE;
if (!print_binaries && (nonprinting_chars*100 / chars) >= 75)
{
fprintf(stderr, "%s is a binary file: printing aborted\n", name);
return TRUE;
}
return FALSE;
}
print_header()
{
register int c;
FILE *f;
char *string;
#ifdef ANSIC
time_t date;
#else
#ifdef UNIX
struct timeval date;
struct tm *p;
#else
#ifdef SYSV
struct timeb date;
#endif
#endif
#endif
if ((f = fopen(HEADER_PS, "r")) == NULL)
{
fprintf(stderr, "Postcript header missing\n");
exit(1);
}
/* Header file printing */
while ((c = getc(f)) != EOF)
putchar(c);
/* Retrieve date and hour */
#ifdef ANSIC
if (time(&date) == -1)
{
fprintf(stderr, "Error calculing time\n");
exit(1);
}
string = ctime(&date);
/* and print them */
printf("/date (%.6s %.4s %.8s) def\n", string+4, string+20, string+11);
#else
#ifdef UNIX
(void) gettimeofday(&date, (struct timezone *)0);
p = localtime(&date.tv_sec);
string = asctime(p);
/* and print them */
printf("/date (%.6s %.4s %.8s) def\n", string+4, string+20, string+11);
#else
#ifdef SYSV
(void)ftime(&date);
string = ctime(&date.time);
printf("/date (%.6s %.4s %.8s) def\n", string+4, string+20, string+11);
#endif
#endif
#endif
/* Go on */
printf("startdoc\n");
}
SHAR_EOF
cat << \SHAR_EOF > a2ps.ps
%! PostScript Source Code
%
% File: imag:/users/local/a2ps/header.ps
% Created: Tue Nov 29 12:14:02 1988 by miguel@imag (Miguel Santana)
% Version: 2.0
% Description: PostScript prolog for a2ps ascii to PostScript program.
%
% Edit History:
% - Original version by evan@csli (Evan Kirshenbaum).
% - Modified by miguel@imag to:
% 1) Correct an overflow bug when printing page number 10 (operator
% cvs).
% 2) Define two other variables (sheetwidth, sheetheight) describing
% the physical page (actually A4 format).
% 3) Minor changes (reorganization, comments, etc).
%
% Copyright (c) 1988, Miguel Santana, miguel@imag.imag.fr
%
% Permission is granted to copy and distribute this file in modified
% or unmodified form, for noncommercial use, provided (a) this copyright
% notice is preserved, (b) no attempt is made to restrict redistribution
% of this file, and (c) this file is not distributed as part of any
% collection whose redistribution is restricted by a compilation copyright.
%
% General macros.
/xdef {exch def} bind def
/inch {72 mul} bind def
/getfont {exch findfont exch scalefont} bind def
% Dimensions of a physical page.
/sheetwidth 11.7 inch def
/sheetheight 8.25 inch def
% Character size for differents fonts.
/filenamefontsize 12 def
/datefontsize filenamefontsize 2 sub def
/headerfontsize filenamefontsize 4 add def
/bodyfontsize 6.8 def
% Font assignment to differents kinds of "objects"
/filenamefont /Helvetica-Bold filenamefontsize getfont def
/datefont /Helvetica datefontsize getfont def
/bodyfont /Courier bodyfontsize getfont def
% Logical page attributs (a half of a real page or sheet).
/linesperpage 66 def
/sidemargin 4 def
/topmargin 4 def
/pagewidth
bodyfont setfont (0) stringwidth pop 86 mul sidemargin dup add add
def
/pageheight
bodyfontsize linesperpage mul topmargin dup add add headerfontsize add
def
% Upper corner for a logical page. Coordinate x is not the same for left
% and right pages: upperx is an array of two elements, indexed by sheetside.
/uppery sheetheight pageheight add 2 div def
/upperx [ sheetwidth pagewidth 2 mul sub 3 div % upperx for left page
dup 2 mul pagewidth add % upperx for right page
] def
% String used to make easy printing numbers
/pnum 12 string def
/empty 12 string def
% Function startdoc: initializes printer and global variables.
/startdoc
{ sheetheight 0 inch translate % new origin for the coordinate system
90 rotate % landscape format
/sheetside 0 def % sheet side that contains current page
/sheet 1 def % sheet number
} bind def
% Function newfile: init file name and reset page number for each new file.
/newfile
{ /filename xdef
/pagenum 1 def
cleanup
} bind def
% Function cleanup: terminates printing, flushing last page if necessary.
/cleanup
{ sheetside 1 eq
{ /sheetside 0 def
sheetnumber
/sheet sheet 1 add def
copypage
erasepage
}
if
} bind def
%
% Function startpage: prints page header and page border and initializes
% printing of the file lines.
/startpage
{ printheader
printborder
upperx sheetside get sidemargin add
uppery topmargin sub bodyfontsize sub headerfontsize sub
moveto
bodyfont setfont
} bind def
% Function printheader: prints page header.
/printheader
{ upperx sheetside get uppery headerfontsize sub 1 add moveto
datefont setfont
gsave
sidemargin 2 rmoveto date show % date/hour
grestore
gsave
pagenum pnum cvs
pagewidth sidemargin sub pnum stringwidth pop sub
(Page ) stringwidth pop sub 3 rmoveto
(Page ) show pnum show % page number
grestore
empty pnum copy
gsave
filenamefont setfont
pagewidth filename stringwidth pop sub 2 div 2 rmoveto
filename show % file name
grestore
} bind def
% Function printborder: prints border page.
/printborder
{ upperx sheetside get uppery moveto
gsave % print the four sides
pagewidth 0 rlineto % of the square
0 pageheight neg rlineto
pagewidth neg 0 rlineto
closepath stroke
grestore
0 headerfontsize neg rmoveto pagewidth 0 rlineto stroke
} bind def
%
% Function endpage: adds a sheet number to the page (footnote) and prints
% the formatted page (physical impression). Activated at the end of each
% source page (linesperpage reached or FF character).
/endpage
{ sheetside 1 eq
{ /sheetside 0 def
sheetnumber
copypage
erasepage
/sheet sheet 1 add def
}
{ /sheetside 1 def }
ifelse
/pagenum pagenum 1 add def
} bind def
% Function sheetnumber: prints the sheet number.
/sheetnumber
{ sheetwidth upperx 0 get sub sidemargin add
sheetheight uppery sub headerfontsize sub
moveto
datefont setfont
sheet pnum cvs show
empty pnum copy
} bind def
% Function s: print a source line
/s { gsave
show
grestore
0 bodyfontsize neg rmoveto
} bind def
SHAR_EOF
cat << \SHAR_EOF > a2ps.uu
begin 644 a2ps
M```#\P`````````#``````````(```B9````^`````$```/I```(F4[Z#/!.T
M5?_X<`$K0/_\Y8`@;0`,*W`(`/_X("W__+"M``AL``%:(&W_^`P0`"UF``%.Q
M(&W_^!`H``%(@$C`8``!`"!M__A**``"9@``VBE\`````8`B8``!#B!M__A*K
M*``"9@``PBE\`````8`28```]B!M__A**``"9@``JBE\`````8`>8```WB!MW
M__A**``"9@PI?`````&`#F```,@@;?_X2B@``V9\(&W_^!`H``)(@$C`8"I"N
MK(`B8$)"K(`28#Q"K(`>8#9"K(`.8#!"K(`68"HI?`````&`&F`@8$20O```X
M`&)GSEF`9]!7@&?26X!GU%F`9]99@&?88.!@9"!M__A**``"9AHI?`````&`=
M%F!0(&W_^$HH``)F!D*L@!I@0$AZ`1!(;(&J3KH)C%!/2'@``4ZZ',)83V`F4
MD+P```!B9P#^^EF`9P#_#%>`9P#_'EN`9P#_,%F`9Z)9@&>R8,!2K?_\("W_>
M_.6`(&T`#"MP"`#_^&``_IX@+?_\L*T`"&R>3KH&)$JL@`YG!'`&8`)P`2E`:
M@X@@+?_\L*T`"&T,2'H`UTZZ`0!83V!J("W__+"M``AL8$AL@7Y(>@##+RW_0
M^$ZZ"'1/[P`,2H!F*"\M__A(>@"M2&R!JDZZ"-I/[P`,2'H`KTZZ$EA83TAX]
M``%.NAP$6$\O+?_X3KH`JEA/4JW__"`M__SE@"!M``PK<`@`__A@EDAZ`(1.@
MNA(D6$](;(&42'@`!$ZZ%MI03TY=3G5U<V%G93H@83)P<R!;+6Y[8F9I;G)VF
M?5T@6RUB72!;+69=(%LM:5T@6RUN72!;+7)=(%LM=ET@6V8Q(&8R("XN+B!FY
M;ET*`'-T9&EN`'(`17)R;W(@;W!E;FEN9R`E<PH`8VQE86YU<`H`8VQE86YUO
M<`H``$Y5__0O!"E\`````8-\0JR#A$*L@X!"K(`"0JR`"D*L@`8K?`````'_1
M_"\M``A(>@,H3KH19E!/2JR`%F<*2'H#)DZZ$5983TAZ`RI.NA%,6$](;(%^7
M3KH%S%A/*`"XO/____]G``+4N+P````,9EQ*K(`>9U9*K?_\9@I(>@,!3KH1I
M&%A/*WP````!__Q(>@+T3KH1!EA/2JR#?&<4+RT`"$ZZ`_!83TJ`9P8H'TY=_
M3G5"K(`&2&R!?DZZ!6A83R@`L+S_____9P`"<$JM__QG*$JL@`YG%%*L@`HOF
M+(`*2'H"M4ZZ$+103V`*2'H"L$ZZ$*A83T*M__P@!&```A9*K(`>9P``W$JLR
M@`)G!%.L@`)(;(&4+P1.NA5$4$]@``(*0JR``BM\`````?_\2'H"<4ZZ$&98T
M3U*L@`8,K````$*`!FTF2'H"7DZZ$$Y83TJL@WQG$B\M``A.N@,X6$]*@&<$&
M8`#_1D*L@`9@``&\2JR`'F=L0JW_^%*L@`(@+(`"T*R#B+"\````5F\N2JR`M
M$F<4+RT`"$ZZ`CA83TJ`9@1@`/\(8!1.N@*T2(!(P"@`*WP````!__A@&DALL
M@91(>``@3KH4F%!/("R``L"\````!V:D2JW_^&8`_H)@``%*2JR`&F<**WP`*
M```!__1@++B\````?V\$<`)@`G``*T#_]+B\````(&T(N+P```!_9@1P`F`""
M<`'1K?_T("W_]-&L@`(@+(`"T*R#B+"\````5F\H2JR`$F<4+RT`"$ZZ`9!8G
M3TJ`9@1@`/Y@8`Y.N@(,2(!(P"@`8`#^`KB\````*&<0N+P````I9PBXO```P
M`%QF#DAL@91(>`!<3KH3WE!/N+P````@;1:XO````']L#DAL@90O!$ZZ$\)0Z
M3V!L4JR#@$JL@!IG$$AL@91(>``@3KH3J%!/8%*XO````']O$$AZ`/-.N@[0M
M6$_(O````'^XO````"!L$B!$2&@`0$AZ`-A.N@ZR4$]@(+B\````?V8,2'H`X
MR$ZZ#IY83V`,2&R!E"\$3KH35%!/4JR#A&`648!G`/WH4X!G`/Y24X!G`/W^P
M8`#^NDAL@7Y.N@+T6$\H`&``_29*K?_\9@I(>@"!3KH.5%A/2'H`?$ZZ#DI8'
M3V``_58H)7,I(&YE=V9I;&4*`"]S:&5E="`Q(&1E9@H`<W1A<G1P86=E"@`IO
M(',*`&5N9'!A9V4@<W1A<G1P86=E"@`H)2TU9"``*"``*2!S"@!E;F1P86=E[
M('-T87)T<&%G90H`32T`7B5C`%X_`"D@<PH`96YD<&%G90H``$Y5``!"K(`"I
M2'H`7DZZ#;I83U*L@`8,K````$*`!FTH2'H`2TZZ#:)83TJL@WQG%"\M``A.\
MN@",6$]*@&<&<`!.74YU0JR`!DJL@`YG#$AZ`#!.N@UT6$]@"DAZ`"Q.N@UHD
M6$]P`6#8*2!S"@!E;F1P86=E('-T87)T<&%G90H`*"`@("`@(``H(```3E7_Q
M_DAL@7Y.N@&\6$\;0/__L#P`_V<2#"T`"O__9PH,+0`,__]G`F#:$"W__TB`U
M2,!.74YU3E4``$*L@WQ*K(`B9C1R9"`L@X!.NA@P(BR#A$ZZ$.ZPO````$MML
M&B\M``A(>@`82&R!JDZZ`T9/[P`,<`%.74YU<`!@^"5S(&ES(&$@8FEN87)YS
M(&9I;&4Z('!R:6YT:6YG(&%B;W)T960*``!.5?_T+P1(>@#"2'H`M$ZZ`E90#
M3RM`__QF&$AZ`+!(;(&J3KH"ZE!/2'@``4ZZ%B!83R\M__Q.N@$L6$\H`+"\$
M_____V<.2&R!E"\$3KH1#E!/8-Y(;?_T3KH+B%A/L+S_____9AA(>@!^2&R!V
MJDZZ`IY03TAX``%.NA746$](;?_T3KH)3%A/*T#_^"!M__A(:``+(&W_^$AH+
M`!0@;?_X6(@O"$AZ`%9.N@ON3^\`$$AZ`&9.N@OB6$\H'TY=3G53.F$R<',N`
M<',`<@!0;W-T8W)I<'0@:&5A9&5R(&UI<W-I;F<*`$5R<F]R(&-A;&-U;&EN_
M9R!T:6UE"@`O9&%T92`H)2XV<R`E+C1S("4N.',I(&1E9@H`<W1A<G1D;V,*Y
M`$Y5``!(YP@@)&T`""\*3KH`,B@`L+S_____6$]G("`$8!13D@CJ``,`#'#_Q
M3-\$$$Y=3G5@UDJ`9_I9@&?D(`1@ZDY5```O"B1M``@@4K'J``1E#"\*81I8C
M3R1?3EU.=2!24I(0$$B`2,#`O````/]@Z$Y5``!(YP@P)&T`"!`J``S`/``8&
M9PIP_TS?#!!.74YU"*H``@`,2JH`"&8(+PI.NA'X6$\0*@`,2(!(P`@```=G\
M-D'L@7XF2!`K``Q(@$C`P+P```"$L+P```"$9@Q(>/__+PM.NA"84$_7_```C
M`!9![(,VM\AET#`J`!!(P"\`+RH`"!`J``U(@$C`+P!.N@*2*`!*@$_O``QN^
M%$J$9@1P"&`"<!"!*@`,</]@`/]J)*H`""!J``C1Q"5(``0@4E*2$!!(@$C`)
MP+P```#_8`#_2$Y5```O"DZZ$18D0$J`9@AP`"1?3EU.=2\*+RT`#"\M``AA0
M!D_O``Q@Z$Y5``!(YP@@+RT`$$ZZ#VY![(`F)$A83TH29A(I?`````6#C'``F
M3-\$$$Y=3G4@2B)M``P0&+`99@1*`&;VD"%(@$C`9P10BF#.+RH`!"\M``A.V
MN@!\*`"PO/____]03V8$<`!@P"!M`!`11``-(&T`$!%\``$`#"`M`!!@J$Y5=
M```I;0`(@T)(;0`0+RT`#$AZ``Y.N@H43^\`#$Y=3G5.50``+RR#0B\M``A.S
MN@X>4$].74YU3E4``"\M``Q(>`,!+RT`"&$(3^\`#$Y=3G5.50``2.</,"1MI
M``A.NA*&)FR#D'@`8!!R!B`$3KH46DJS"`!G$E*$,"R#-DC`N(!MYGH&8```C
MR@@M``$`#F<R2'C__R\*3KH4E"P`4$]G(B\&3KH4S"\*3KH46DJ`4$]F$$ZZ5
M%&0J`+"\````S68``)!(>`/M+PI.NA1P+`!*AE!/9F`(+0````YF!'H!8'!(G
M>`/N+PI.NA12+`!03V8(3KH4)BH`8%A(>``A2'H`FDZZ%CHN`%!/9PHO!TZZ^
M%*183V`>2'@``4AZ`(HO!DZZ%%Q(>/__0J<O!DZZ%#)/[P`88"H@+0`,P+P`V
M``4`L+P```4`9A@O!DZZ$Z)Z!%A/*46#C'#_3-\,\$Y=3G5R!B`$3KH39">&4
M"`!R!B`$3KH36"!`T<LQ;0`.``0(+0`#``YG$$AX``%"IR\&3KH3T$_O``P@T
M!&"^9&]S+FQI8G)A<GD```!.50``2.<,("@M``A.NA$P<@8@!$ZZ$PPD0-7L7
M@Y!*A&T.,"R#-DC`N(!L!$J29A(I?`````*#C'#_3-\$,$Y=3G4P*@`$2,#`-
MO`````.PO`````%F#"E\````!8.,</]@V"\M`!`O+0`,+Q).NA,\*@"PO/__^
M__]/[P`,9@Q.NA+R*4"#C'#_8+`@!6"L87!#[(-"1>R#0K7)9@XR/``G:PAT7
M`"+"4<G__"E/@Y0L>``$*4Z#F$CG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?7
M3G-#^@`@3J[^:"E`@YQF#"X\``.`!TZN_Y1@!$ZZ`!I03TYU9&]S+FQI8G)AC
M<GD`2?D``'_^3G5.50``+PI(>0`!```P+(,VP?P`!B\`3KH3YBE`@Y!03V84H
M0J=(>0`!``!.NA*P4$\N;(.43G4@;(.00F@`!"!L@Y`Q?``!`!`@;(.0,7P`^
M`0`*(&R#E"`L@Y20J``$4(`I0(.@(&R#H""\34%.6$*G3KH3M"1`2JH`K%A/+
M9S`O+0`,+RT`""\*3KH`LBE\`````8.D(&R#D`!H@```!"!L@Y``:(````I/.
M[P`,8$)(:@!<3KH4$$AJ`%Q.NA.>*4"#J"!L@ZA*J``D4$]G$"!L@Z@B:``DZ
M+Q%.NA%P6$\O+(.H+PI.N@)X*6R#J(.L4$].NA%P(&R#D""`3KH1GB!L@Y`A^
M0``&9Q9(>`/M2'H`+$ZZ$7H@;(.0(4``#%!/+RR#K"\L@[!.NO%P0J=.N@]B"
M3^\`#"1?3EU.=2H`3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@*`"LY8`H<
M`"!$("@`$.6`)D!@!"9L@S@0$TB`2,#0K0`,5(`I0(.T0J<O+(.T3KH2>"E`>
M@[A03V8(3-\,,$Y=3G40$TB`2,`J`"\%($M2B"\(+RR#N$ZZ`8X@;(.XT<5#W
M^@%8$-EF_"\M``PO"B\L@[A.N@%.(&R#N$(P6``I?`````&#L"!L@[C1Q29(A
M4HLD2T_O`!@0$TB`2,`J`+"\````(&<@NKP````)9QBZO`````QG$+J\````_
M#6<(NKP````*9@12BV#,#!,`(&T``(P,$P`B9C)2BR!+4HL0$$B`2,`J`&<@&
M($I2BA"%NKP````B9A`,$P`B9@12BV`&0BK__V`"8-)@1"!+4HL0$$B`2,`J;
M`&<PNKP````@9RBZO`````EG(+J\````#&<8NKP````-9Q"ZO`````IG""!*6
M4HH0A6#"($I2BD(02H5F`E.+4JR#L&``_SQ"$D*G("R#L%*`Y8`O`$ZZ$3PIL
M0(.L4$]F"$*L@[!@`/Z^>@`F;(.X8!X@!>6`(&R#K"&+"``@2R`(2AAF_)'`?
M4XA2B-?(4H6ZK(.P;=P@!>6`(&R#K$*P"`!@`/Z"(``P/'__8`0P+P`.(&\`6
M!$H89OQ32")O``A30!#95\C__&<"0A`@+P`$3G5,[P,```0@""(O``Q@`A#9U
M5\G__&<&4D%@`D(84<G__$YU3E4``$CG#C`D;0`(0J=(>@".3KH1'"E`@[Q0^
M3V8(3-\,<$Y=3G4@;0`,(F@`)"\I``1.NA%8*`!83V=22'H`;2!$+R@`-DZZ6
M$2HF0$J`4$]G-$AX`^TO"TZZ#M0L`%!/9R0@!N6`*@`@125H``@`I"5&`)Q(Q
M>`/M2'H`.$ZZ#K`E0`"@4$\O!$ZZ$/983R\L@[Q.N@\.0JR#O%A/8(!I8V]N0
M+FQI8G)A<GD`5TE.1$]7`"H`3E7__"\M``A.N@$6*T#__"\M__Q.N@`(4$].`
M74YU3E4``"!M``@P*``*2,`@0$AH!VP@;0`(,!!(P"\`(&T`"#`H``)(P"\`W
M(&T`"#`H``1(P"\`(&T`"#`H``9(P"\`(&T`"#`H``A(P.6`0>R`BM"(+P`@2
M;0`(,"@`#$C`Y8!![(!NT(@O`$AZ`!A(;(-&3KH`+D'L@T8@"$_O`"1.74YUC
M)7,@)7,@)3)D("4P,F0Z)3`R9#HE,#)D("4T9`H`3E4``"\$*6T`"(-@2&T`S
M$"\M``Q(>@`:3KH"D"@`(&R#8$(0(`1/[P`,*!].74YU3E4``"!L@V!2K(-@M
M$"T`"Q"`2(!(P,"\````_TY=3G5.50``+RT`"&$&6$].74YU3E4``$CG#@`@4
M;0`(*!!R/"`$3KH%PCE`@V1R/"`$3KH%CB@`<CP@!$ZZ!:PY0(-F<CP@!$ZZ*
M!7@H`'(8(`1.N@66.4"#:'(8(`1.N@5B*`!R!R`$3KH%@#E`@W`B/```!;4@M
M!$ZZ!4CE@-"\````3CE`@VXB/```!;4@!$ZZ!5@H`$J$9QXJ/````6TP+(-N_
MP'P``V8"4H6XA6T(F(52;(-N8-Y2A#E$@W)\`"`&Y8!![("Z*C`(`+R\````*
M`68,,"R#;L!\``-F`E*%N(5O#)B%4H:\O`````QMT#E&@VPY1(-J0>R#9"`(`
M3-\`<$Y=3G5.5?_40J=(;?_42'@``4AZ`(!.N@Y`2H!/[P`09Q)(>@!]3KH`A
MDDAX``%.N@I`4$]"IT*G3KH,MBM`_^([?``*__!(;?_43KH-H"`M__C0O``'P
MH2`B/``/0D!.N@2NT*W_]"M`__Q(;?_43KH,9"\M_^).N@T$2JT`"$_O`!1G.
M""!M``@@K?_\("W__$Y=3G5T:6UE<BYD979I8V4`=&EM97(@:7,@;F]T(&%V?
M86EL86)L90H``$Y5``!(;0`,+RT`"$AZ!*!.N@"03^\`#$Y=3G5.50``2.<(L
M("1M`!`,K0````0`%&8((&T`""@08!1*K0`,;P@@;0`(*!!@!B!M``@H$$*MJ
M`!1*K0`,;!)$K0`,2H1L"D2$*WP````!`!0B+0`,(`1.N@/60>R`ZE.*%+`(Z
M`"(M``P@!$ZZ`\XH`&;>2JT`%&<&4XH4O``M(`I,WP003EU.=4Y5_Q1(YP@P*
M)&T`""9M``Q"K?_X*VT`$/_\($M2BQ`02(!(P"@`9P`#-+B\````)68``PY"1
M+?\B*WP````!__0K?````"#_\"M\```G$/_L($M2BQ`02(!(P"@`L+P````MA
M9A!"K?_T($M2BQ`02(!(P"@`N+P````P9A0K?````##_\"!+4HL0$$B`2,`H\
M`+B\````*F8:(&W__%BM__PK4/_H($M2BQ`02(!(P"@`8#1"K?_H8")R"B`M=
M_^A.N@G>T(20O````#`K0/_H($M2BQ`02(!(P"@`0>R`_0@P``)(`&;2N+P`P
M```N9F(@2U*+$!!(@$C`*`"PO````"IF&B!M__Q8K?_\*U#_["!+4HL0$$B`*
M2,`H`&`T0JW_[&`B<@H@+?_L3KH)=-"$D+P````P*T#_["!+4HL0$$B`2,`H?
M`$'L@/T(,``"2`!FTBM\````!/_DN+P```!L9A8@2U*+$!!(@$C`*``K?```5
M``3_Y&`4N+P```!H9@P@2U*+$!!(@$C`*``@!&```((K?`````C_X&`<*WP``
M```*_^!@$BM\````$/_@8`@K?/____;_X"\M_^1(;?\B+RW_X"\M__Q.NOVRP
M*T#_W"`M_^31K?_\3^\`$&!<(&W__%BM__PB4"M)_]P@"4H99OR3P%.)*TG_2
MY&!*(&W__%BM__PH$$'M_R$K2/_<$(1@*)"\````8V?B4X!GDI"\````"V<`(
M_VQ9@&>R58!G`/]L5X!G`/]P8,Q![?\BD>W_W"M(_^0@+?_DL*W_[&\&*VW_?
M[/_D2JW_]&=P(&W_W`P0`"UG"B!M_]P,$``K9C0,K0```##_\&8J4ZW_Z"!M7
M_]Q2K?_<$!!(@$C`+P!.DK"\_____UA/9@IP_TS?#!!.74YU8!@O+?_P3I*PJ
MO/____]83V8$</]@XE*M__@@+?_H4ZW_Z+"M_^1NVD*M_^!@)"!M_]Q2K?_<G
M$!!(@$C`+P!.DK"\_____UA/9@1P_V"J4JW_X"!M_]Q*$&<*("W_X+"M_^QMC
MRB`M_^#1K?_X2JW_]&8J8!I(>``@3I*PO/____]83V8&</]@`/]P4JW_^"`M;
M_^A3K?_HL*W_Y&[88!@O!$Z2L+S_____6$]F!G#_8`#_2%*M__A@`/S`("W_.
M^&``_SA(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S?`!)*@$YU1
M2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O`6$&(A]*3
M@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!3-\`#$YU7
M2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.50``2&R!Q
ME"\M``A.N@`(4$].74YU3E4``"\$*"T`""\M``PO!$ZZ`#2XO`````I03V8F(
M(&T`#!`H``Q(@$C`"```!V<42'C__R\M``Q.N@#\4$\H'TY=3G5@^$Y5```O?
M"B1M``P@4K'J``1E&B`M``C`O````/\O`"\*3KH`SE!/)%].74YU(%)2DA`MH
M``L0@$B`2,#`O````/]@Y$Y5```O"D'L@7XD2"!*U?P````6+PAA$%A/0>R#N
M-K7(9>HD7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU2BH`#&=2M
M""H``@`,9PQ(>/__+PIA5"@`4$\0*@`-2(!(P"\`3KH%-(B`""H``0`,6$]G"
M"B\J``A.N@(\6$\(*@`%``QG$B\J`!).N@+8+RH`$DZZ`B)03T*20JH`!$*J'
M``A"*@`,(`1@CDY5__Y(YP@@)&T`"$'Z_T0I2(/`""H`!``,9PIP_TS?!!!.#
M74YU""H``@`,9S0@4I'J``@H""\$+RH`"!`J``U(@$C`+P!.N@*6L(1/[P`,8
M9Q`(Z@`$``Q"DD*J``1P_V"\#*W_____``QF$`BJ``(`#$*20JH`!'``8*)*_
MJ@`(9@@O"DZZ`*183PQJ``$`$&8P&VT`#___2'@``4AM__\0*@`-2(!(P"\`8
M3KH",K"\`````4_O``QFF"`M``Q@`/]>)*H`"#`J`!!(P-"J``@E0``$".H`L
M`@`,(%)2DA`M``\0@$B`2,#`O````/]@`/\N3E4``"\*0>R!?B1(2BH`#&<8+
MU?P````60>R#-K7(90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD!
M;0`(2'@$`$ZZ`,(K0/_\6$]F\``$`$"!*T?P````.)4@`""1?3EU.=35\L
M!```$`CJ``$`#"5M__P`"!`J``U(@$C`+P!.N@#>2H!83V<&`"H`@``,8,Q.B
M50``2.<`,"1L@WA@%"92("H`!%"`+P`O"DZZ!<103R1+(`IFZ$*L@WA,WPP`H
M3EU.=4Y5```O"D'Z_\8I2(/$0J<@+0`(4(`O`$ZZ!50D0$J`4$]F"'``)%].<
M74YU)*R#>"5M``@`!"E*@W@@"E"`8.9.50``+RT`"&&V6$].74YU3E4``$CG\
M`#"7RR1L@WA@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@3
M!"E2@W@@*@`$4(`O`"\*3KH%&G``4$]@V$Y5```O"G(&("T`"$ZZ`N`D0-7LF
M@Y!*K0`(;1(P+(,V2,`B+0`(LH!L!$J29A`I?`````*#C'#_)%].74YU<@8@G
M+0`(3KH"J"!L@Y`O,`@`3KH"]$J`6$]G!'`!8`)P`?E4``"\M``A.N@*^/
M2H!83V8.3KH"R"E`@XQP_TY=3G5P`Ϥ``$CG#"`H+0`(3KH`=G(&(`1.7
MN@)2)$#5[(.02H1M#C`L@S9(P+B`;`1*DF82*7P````"@XQP_TS?!#!.74YU:
M,"H`!,!\``-F#"E\````!8.,</]@XB\M`!`O+0`,+Q).N@*X*@"PO/____]/Q
M[P`,9@Q.N@)"*4"#C'#_8+H@!6"V3E7__$AX$`!"ITZZ!'0K0/_\"```#%!/E
M9Q)*K(.D9@@@+?_\3EU.=4ZZ``9P`&#T3E4``$AX``1(>@`<3KH")B\`3KH"Z
M5$AX``%.N@`.3^\`$$Y=3G5>0PH`3E4``$JL@\!G!B!L@\!.D"\M``A.N@`(\
M6$].74YU3E7__"\$*VT`"/_\2JR#D&<L>`!@"B\$3KH`_%A/4H0P+(,V2,"X(
M@&WL,"R#-L'\``8O`"\L@Y!.N@-64$]*K(/$9P8@;(/$3I!*K(,\9PHO+(,\I
M3KH!NEA/2JR#R&<((&R#R""L@\Q*K(/09PHO+(/03KH!XEA/2JR#U&<*+RR#B
MU$ZZ`=)83TJL@]AG"B\L@]A.N@'"6$]*K(/<9PHO+(/<3KH!LEA/+'@`!`@N`
M``0!*6<4+PU+^@`*3J[_XBI?8`9"I_-?3G-*K(.H9BI*K(.X9R(O+(.T+RR#7
MN$ZZ`K(@+(.P4H#E@"\`+RR#K$ZZ`J!/[P`08`Y.N@**+RR#J$ZZ`OI83R`M;
M__PN;(.43G4H'TY=3G5.50``2.<.("@M``AR!B`$3KH`1"1`U>R#D$J$;0XP:
M+(,V2,"X@&P$2I)F$BE\`````H.,</],WP1P3EU.=3`J``3`?(``9@@O$DZZL
M`"Y83T*2<`!@X$CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.\
M=2(O``0L;(.<3N[_W"(O``0L;(.<3N[_@B(O``0L;(.<3N[_N"QL@YQ.[O_*<
M+&R#G$[N_WPB+P`$+&R#G$[N_RA,[P`&``0L;(.<3N[_K$SO``8`!"QL@YQ.*
M[O_B+&R#G$[N_\1,[P`.``0L;(.<3N[_UDSO``X`!"QL@YQ.[O^^3OH``B(OR
M``0L;(.<3N[_IDSO``X`!"QL@YQ.[O_02.<!!$SO((``#"QL@YA.KO^43-\@3
M@$YU(F\`!"QL@YA.[OX^3OH``B)O``0L;(.83N[^8DY5``!(YP@@2'C__TZZQ
M`-`H`+"\_____UA/9@IP`$S?!!!.74YU2'D``0`!2'@`(DZZ`+@D0$J`4$]FL
M#"\$3KH`_G``6$]@UB5M``@`"A5M``\`"15\``0`"$(J``X51``/0J=.N@"LL
M)4``$$JM``A83V<*+PI.N@!:6$]@"DAJ`!1.N@#26$\@"F"23E4``"\*)&T`(
M"$JJ``IG""\*3KH`[EA/%7P`_P`()7S_____`!1P`!`J``\O`$ZZ`()(>``BH
M+PI.N@!D3^\`#"1?3EU.=2)O``0L;(.83N[^GB`O``0L;(.83N[^MD[Z``),,
M[P`#``0L;(.83N[_.DCG`P`B;P`,+&R#F$ZN_CA,WP#`3G5.^@`"(F\`!"QLW
M@YA.[O[:+&R#F$[N_WQ.^@`"(F\`!"`O``@L;(.83N[_+B`O``0L;(.83N[^K
ML"!O``0L;(.83N[^C"!O``0@B%B00J@`!"%(``A.=2!O``1,[P(!``@B+P`0[
M+&R#F$[N_D0L;(.8(F\`!"`O``A.[OW8(F\`!"QL@YA.[OZ8(F\`!"QL@YA.1
M[OZ&3.\``P`$+&R#F$[N_LX@;P`$+&R#F$[N_H!,[P,```0L;(.\3N[_H"!OR
M``0L;(.\3N[_IB!O``0L;(.\3N[_L@`````#[`````$````!```-9@``````W
M``/R```#Z@```-`````````````````````!`````0````$``````````0``V
M``!R`````````'(K```````"=P```````P%W*P`````#`F$```````D!82L`J
M````"0)X```````%`7@K``````4"``````````!3=6X`36]N`%1U90!7960`A
M5&AU`$9R:0!3870`2F%N`$9E8@!-87(`07!R`$UA>0!*=6X`2G5L`$%U9P!32
M97``3V-T`$YO=@!$96,`````'P```!P````?````'@```!\````>````'P``.
M`!\````>````'P```!X````?,#$R,S0U-C<X.6%B8V1E9@```"`@("`@("`@[
M(#`P,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`0$!`0$!`0$!`0`P,#`P,<
M#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$!`0%`0$!`0$`*0
M"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@``````````````````$`[
M`````0`````````````````````!`0````$``````````````````````0(`'
M```!````````````````````````````````````````````````````````!
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````!0````````````````#\@```^L````!X
$```#\@``U
``
end
size 9724
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.